package com.example.lean;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

//实现MediaPlayer的3个的事件监听接口
public class MainActivity extends AppCompatActivity
        implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, SensorEventListener {
    private static final String TAG = "MainActivity";

    SensorManager sm;         //用来引用【传感器管理员】
    Sensor sr;                //用来引用【加速传感器对象】
    int delay = 0;            //用来延迟体感控制的检测间隔
    boolean sensorPauseFlag = false; //是否扣下电话导致的暂停标记

    Uri uri;      //存储影音文件的Uri
    TextView txvName, txvUri;   //引用到画面中的组件
    boolean isVideo = false;   //记录是否为视频文件
    Button btnPlay, btnStop;    //用来引用播放按钮，停止按钮
    CheckBox ckbLoop;          //用来引用重复播放多选按钮
    MediaPlayer mper;          //用来引用MediaPlayer对象
    Toast tos;                 //用来引用Tost对象（用于显示信息）


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "onCreate: ");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //设置屏幕不随手机旋转以及界面直向显示
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);   //设置屏幕不随手机旋转
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);   //设置屏幕直向显示
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  //设置屏幕不进入休眠

        txvName = findViewById(R.id.txvName);   //引用到第一个文字组件
        txvUri = findViewById(R.id.txvUri);     //引用到第二个文字组件
        btnPlay = findViewById(R.id.btnPlay);     //引用到播放按钮
        btnStop = findViewById(R.id.btnStop);     //引用到停止按钮
        ckbLoop = findViewById(R.id.ckbLoop);   //引用到重复播放多选按钮
        //默认会播放程序内的音乐文件
        uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.welcome);
        txvName.setText("welcome.mp3");           //在画面中显示文件名
        txvUri.setText("程序内的乐曲：" + uri.toString());   //显示Uri
        mper = new MediaPlayer();           //创建MediaPlayer对象
        mper.setOnPreparedListener(this);  //设置3个事件监听器
        mper.setOnErrorListener(this);
        mper.setOnCompletionListener(this);
        tos = Toast.makeText(this, "", Toast.LENGTH_SHORT);//创建Toast对象
        prepareMusic();     //准备音乐（welcome.mp3)的播放

        //从服务器获得传感器管理员
        sm = (SensorManager) getSystemService(SENSOR_SERVICE);
        sr = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //获得加速传感器
    }

    //准备数据
    void prepareMusic() {
        btnPlay.setText("播放");           //将按钮文字恢复为“播放”
        btnPlay.setEnabled(false);             //使播放按钮不能按（要等准备好才能按）
        btnStop.setEnabled(false);             //使停止按钮不能按
        try {
            mper.reset();            //如果之前播过歌，必须reset后才能换歌
            mper.setDataSource(this, uri);     //指定歌曲来源
            mper.setLooping(ckbLoop.isChecked());    //设置是否重复播放
            mper.prepareAsync();                //要求MediaPlayer准备播放指定的音乐
        } catch (Exception e) {        //拦截错误并显示信息
            tos.setText("指定音乐文件错误！" + e.toString());
            tos.show();
        }
    }

    @Override
    protected void onResume() {
        Log.i(TAG, "onResume: ");
        super.onResume();
        //向加速传感器(sr）注册监听对象（this)
        sm.registerListener(this, sr, SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        Log.i(TAG, "onPause: ");
        super.onPause();
        if (mper.isPlaying()) {   //如果正在播放，就暂停
            btnPlay.setText("继续");
            mper.pause();  //暂停播放
        }
        //取消监听对象（this)的注册
        sm.unregisterListener(this);
    }

    @Override
    protected void onDestroy() {
        Log.i(TAG, "onDestroy: ");
        mper.release();//释放MediaPlayer对象
        super.onDestroy();
    }

    //选择文件
    public void onPick(View v) {
        //设置过滤文件类型 https://blog.csdn.net/DayDayPlayPhone/article/details/52216055
        //intent.setType(“image/*”);//选择图片
        //intent.setType(“audio/*”); //选择音频
        //intent.setType(“video/*”); //选择视频 （mp4 3gp 是android支持的视频格式）
        //intent.setType(“video/*;image/*”);//同时选择视频和图片
        //intent.setType("*/*");//无类型限制
        Intent it = new Intent(Intent.ACTION_GET_CONTENT);  //创建动作为“选取内容”的Intent
        it.addCategory(Intent.CATEGORY_OPENABLE);
        if (v.getId() == R.id.btnPickAudio) {    //如果是“选取歌曲”按钮
            it.setType("audio/*");   //要选取所有的音乐类型
            startActivityForResult(it, 100);  //以识别编号100来启动外部程序
        } else {     //否则就是“选取视频”按钮
            it.setType("video/*"); //要选取所有视频类型
            startActivityForResult(it, 101);  //以识别编号101来启动外部程序
        }
    }

    //放回选择到的文件
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data != null) {
            if (resultCode == Activity.RESULT_OK) {
                //如果选取成功
                isVideo = (requestCode == 101);       //记录是否选取了视频文件（当标识码为101时）
            }
            Log.i(TAG, "before convertUri: " + data.getData().toString());
            String path = FileChooseUtil.getInstance(this).getChooseFileResultPath(data.getData());
            Log.i(TAG, "onActivityResult: path=" + path);
            uri = Uri.parse("file://" + path);   //将路径转为Uri
            Log.i(TAG, "end convertUri: " + uri.toString());
            txvName.setText(uri.getLastPathSegment());   //显示文件名（Uri最后一段文字）
            txvUri.setText("文件位置：" + uri.getPath());   //显示文件的路径
            if (!isVideo) {
                //准备好音乐播放数据
                prepareMusic();
            }
        } else {
            Toast.makeText(this, "未选择文件！", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onPrepared(MediaPlayer mediaPlayer) {
        Log.i(TAG, "onPrepared: ");
        btnPlay.setEnabled(true);        //当准备好时，让播放按钮起作用（可以单击)
    }

    @Override
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
        Log.i(TAG, "onError: ");
        tos.setText("发生错误，停止播放");    //当发生错误时，显示错误信息
        tos.show();
        return true;
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {
        Log.i(TAG, "onCompletion: ");
        //音乐播放完后
        mper.seekTo(0);           //将播放位置归0
        btnPlay.setText("播放");         //让播放按钮显示“播放”
        btnStop.setEnabled(false);       //让停止按钮禁用（不能单击），因为音乐已经停止播放
    }

    //单击播放按钮时
    public void onMpPlay(View v) {
        if (!isVideo) {
            //播放音乐
            if (mper.isPlaying()) {  //如果正在播，就暂停
                mper.pause();  //暂停播放
                btnPlay.setText("继续");
            } else {   //如果没有在播，就开始播
                mper.start();   //开始播放
                btnPlay.setText("暂停");
                btnStop.setEnabled(true);
            }
        } else {
            //播放视频.创建启动Video Activity的Intent,将视频的Uri以“uri”为名加入Intent中
            Intent it = new Intent(this, VideoActivity.class);
            it.putExtra("uri", uri.toString());
            startActivity(it);
        }
    }

    //单击停止按钮时
    public void onMpStop(View v) {
        mper.pause();  //暂停播放
        mper.seekTo(0);//移动音乐中0秒的位置
        btnPlay.setText("播放");
        btnStop.setEnabled(false);
    }

    //单击设置循环播放的播放多选按钮时
    public void onMpLoop(View v) {
        if (ckbLoop.isChecked())
            mper.setLooping(true);  //设置要重复播放
        else
            mper.setLooping(false); //设置不要重复播放
    }

    //单击倒退图形按钮时
    public void onMpBackward(View v) {  //单击倒退图形按钮时
        if (!btnPlay.isEnabled()) return;   //如果还没准备好（播放按钮不能按），则不处理
        int len = mper.getDuration();  //读取音乐长度
        int pos = mper.getCurrentPosition();  //读取当前播放位置
        pos -= 10000;  //倒退10秒
        if (pos < 0) pos = 0;  //不可小于0
        mper.seekTo(pos);    //移动播放位置
        tos.setText("倒退10秒:" + pos / 1000 + "/" + len / 1000);   //显示信息
        tos.show();
    }

    //单击前进图形按钮时
    public void onMpForward(View v) {
        if (!btnPlay.isEnabled()) return;   //如果还没准备好（播放按钮不能按），则不处理
        int len = mper.getDuration();  //读取音乐长度
        int pos = mper.getCurrentPosition();   //读取当前播放位置
        pos += 10000;   //前进10秒
        if (pos > len) pos = len;  //不可大于总秒数
        mper.seekTo(pos);//移动播放位置
        tos.setText("前进10秒:" + pos / 1000 + "/" + len / 1000);//显示信息
        tos.show();
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        float x, y, z;
        x = sensorEvent.values[0];
        y = sensorEvent.values[1];
        z = sensorEvent.values[2];
        //如果手机面朝下平放
        if (Math.abs(x) < 1 && Math.abs(y) < 1 && z < -9) {
            if (mper.isPlaying()) {//如果正在播放，就要暂停
                btnPlay.setText("继续");
                mper.pause();
                //保存标识，记录是因为扣下电话引起的播放暂停
                sensorPauseFlag = true;
            }
        } else if (Math.abs(x) < 1 && Math.abs(y) < 1 && z > 9) {
            //如果体感导致的暂停则在正面朝上的时候继续播放
            if (sensorPauseFlag && !mper.isPlaying() && btnPlay.getText().equals("继续")) {
                btnPlay.setText("暂停");
                mper.start();
                sensorPauseFlag = false;
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {
    }
}